#ifndef COMMANDS_INPUT_H_
#define COMMANDS_INPUT_H_

#include "./Command.h"
#include "../GameLogic/Objects/GameObject.h"
#include "../GameLogic/Simulation.h"

#include "../Core/PvN.h"

namespace Commands {

template < CommandTypes CommandType >
class AlterBehaviourFlags : public Command {
	GameLogic::Objects::GameObject::IdType object_id_; //TODO: Id
	int behaviour_flags_;
	bool changed_by_input_;
public:

	/**
	 * Tworzy komende modyfikujaca znaczniki zachowania obiektu.
	 * @param object_id Obiekt, dla ktorego dokonana zostanie zmiana.
	 * @param behaviour_flags Flagi zachowania obiektu ktore zostana zmodyfikowane.
	 * @param changed_by_input Wartosc true powinna zostac ustawiona, jezeli zmiana flag dokonana jest przez
	 * interakcje z graczem, tzn. przechwycenie nacisniecia przycisku odpowiadajacego za zmiane zachowania.
	 */
	AlterBehaviourFlags( GameLogic::Objects::GameObject::IdType object_id, int behaviour_flags, bool changed_by_input = false):
		object_id_( object_id )
,		behaviour_flags_( behaviour_flags )
,		changed_by_input_( changed_by_input )
	{}

	~AlterBehaviourFlags() {}

	void execute( GameLogic::Simulation* s ) {
		//pobiera obiekt do ktorego tyczy sie komenda.
		GameLogic::Objects::GameObject* go = Core::PvN::getInstance().getSimulation()->getGameObject( object_id_ );
		if( go == 0 ) return;
		//okresla, czy zmiana zachowania zostala spowodowana przez wejscie gracza.
		if( changed_by_input_ )
			go->setBehaviourChangedByPlayerInput( true );
		//jezeli obiekt istnieje, to wykonuje:
		int current_flags = go->getBehaviourFlags();

		if( CommandType == ctBegin ) {
			current_flags |= behaviour_flags_;
			go->setBehaviourFlags( current_flags );
		} else {
			current_flags &= ~behaviour_flags_;
			go->setBehaviourFlags( current_flags );
		}
	}

	void serialize( std::ostringstream& s ) {
		s << Network::UDPIO::SET_BEHAVIOUR << SEPARATOR;
		s << CommandType << SEPARATOR;
		s << object_id_.toNumeric() << SEPARATOR;
		s << behaviour_flags_ << SEPARATOR;
		s << false;
	}

};

} //namespace Commands

#endif /* COMMANDS_INPUT_H_ */
